home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / xpath < prev    next >
Text File  |  2004-10-28  |  5KB  |  206 lines

  1. #!/usr/bin/perl -w
  2.  
  3. eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
  4.     if 0; # not running under some shell
  5.  
  6. eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
  7.     if 0; # not running under some shell
  8. use strict;
  9.  
  10. $| = 1;
  11.  
  12. use XML::XPath;
  13.  
  14. my @paths;
  15. my $pipeline;
  16. my $SUFFIX = "\n";
  17. my $PREFIX = "";
  18. my $quiet = 0;
  19.  
  20.  
  21. PARSE: while ((@ARGV >= 1) && ($ARGV[0] =~ /^-./ )) {
  22.     OPTIONS: {
  23.         if ($ARGV[0] eq "-e") {
  24.             shift;
  25.             push @paths, shift;
  26.             last OPTIONS;
  27.         }
  28.         if ($ARGV[0] eq "-p") {
  29.             shift;
  30.             $PREFIX = shift;
  31.             last OPTIONS;
  32.         }
  33.         if ($ARGV[0] eq "-s") {
  34.             shift;
  35.             $SUFFIX = shift;
  36.             last OPTIONS;
  37.         }
  38.         if ($ARGV[0] eq "-q") {
  39.             $quiet = 1;    
  40.             shift;
  41.             last OPTIONS;
  42.         }
  43.         print STDERR "Unknown option ignore: ", shift;
  44.     }
  45. }
  46.  
  47. unless (@paths >= 1) {
  48.     print STDERR qq(Usage:
  49. $0 [options] -e query [-e query...] [filename...]
  50.                 
  51.     If no filenams are given, supply XML on STDIN.
  52.     You must provide at least one query. Each supplementary
  53.     query is done in order, the previous query giving the
  54.     context of the next one.
  55.  
  56.     Options:
  57.  
  58.     -q        quiet. Only output the resulting PATH
  59.     -s suffix    use suffix instead of linefeed.
  60.     -p postfix    use prefix instead of nothing.
  61. );
  62.     exit;
  63. }
  64.  
  65. do
  66. {
  67.     my $xpath;
  68.     my @curpaths = @paths;
  69.     my $filename;
  70.     if (@ARGV >= 1) {
  71.         $filename = shift @ARGV;
  72.         $xpath = XML::XPath->new(filename => $filename);
  73.     }
  74.     else {
  75.         $filename = 'stdin';
  76.         $xpath = XML::XPath->new(ioref => \*STDIN);
  77.     }
  78.  
  79.     my $nodes = $xpath->find(shift @curpaths);
  80.  
  81.     if ($nodes->isa('XML::XPath::NodeSet')) {
  82.         while (@curpaths >= 1) {
  83.             $nodes = find_more($xpath, shift @curpaths, $nodes);
  84.             last unless $nodes->isa('XML::XPath::NodeSet');
  85.         }
  86.     }
  87.  
  88.     if ($nodes->isa('XML::XPath::NodeSet')) {
  89.         if ($nodes->size) {
  90.             print STDERR "Found ", $nodes->size, " nodes in $filename:\n" unless $quiet;
  91.             foreach my $node ($nodes->get_nodelist) {
  92.                 print STDERR "-- NODE --\n" unless $quiet;
  93.                 print $PREFIX, $node->toString, $SUFFIX;
  94.             }
  95.         }
  96.         else {
  97.             print STDERR "No nodes found in $filename" unless $quiet;
  98.         }
  99.     }
  100.     else {
  101.         print STDERR "Query didn't return a nodeset. Value: ";
  102.         print $nodes->value, "\n";
  103.     }
  104.  
  105. } until (@ARGV < 1);
  106.  
  107. exit;
  108.  
  109. sub find_more {
  110.     my $xpath = shift;
  111.     my $find = shift;
  112.     my ($nodes) = @_;
  113.     
  114.     my $newnodes = XML::XPath::NodeSet->new;
  115.     
  116.     foreach my $node ($nodes->get_nodelist) {
  117.         my $new = $xpath->find($find, $node);
  118.         if ($new->isa('XML::XPath::NodeSet')) {
  119.             $newnodes->append($new);
  120.         }
  121.         else {
  122.             warn "Not a nodeset: ", $new->value, "\n";
  123.         }
  124.     }
  125.     
  126.     return $newnodes;
  127. }
  128.  
  129. __END__
  130.  
  131. =head1 NAME
  132.  
  133. xpath - a script to query XPath statements in XML documents.
  134.  
  135. =head1 SYNOPSIS
  136.  
  137. B<xpath [-s suffix] [-p prefix] [-q] -e query [-e query] ... [file] ...>
  138.  
  139. =head1 DESCRIPTION
  140.  
  141. B<xpath> uses the L<XML::XPath|XML::XPath> perl module to make XPath queries
  142. to any XML document. The L<XML::XPath|XML::XPath> module aims to comply exactly
  143. to the XPath specification at C<http://www.w3.org/TR/xpath> and yet
  144. allows extensions to be added in the form of functions.
  145.  
  146. The script takes any number of XPath pointers and tries to apply them
  147. to each XML document given on the command line. If no file arguments
  148. are given, the query is done using C<STDIN> as an XML document.
  149.  
  150. When multiple queries exist, the result of the last query is used as
  151. context for the next query and only the result of the last one is output.
  152. The context of the first query is always the root of the current document.
  153.  
  154. =head1 OPTIONS
  155.  
  156. =head2 B<-q>
  157.  
  158. Be quiet. Output only errors (and no separator) on stderr.
  159.  
  160. =head2 B<-s suffix>
  161.  
  162. Place C<suffix> at the end of each entry. Default is a linefeed.
  163.  
  164. =head2 B<-p prefix>
  165.  
  166. Place C<prefix> preceding each entry. Default is nothing.
  167.  
  168. =head1 BUGS
  169.  
  170. The author of this man page is not very fluant in english. Please,
  171. send him (L<fabien@tzone.org>) any corrections concerning this text.
  172.  
  173. See also L<XML::XPath(3pm)>.
  174.  
  175. =head1 SEE ALSO
  176.  
  177. L<XML::XPath(3pm)>.
  178.  
  179. =head1 HISTORY
  180.  
  181. This module is copyright 2000 Fastnet Software Ltd. This is free
  182. software, and as such comes with NO WARRANTY. No dates are used in this
  183. module. You may distribute this module under the terms of either the
  184. Gnu GPL,  or under specific licencing from Fastnet Software Ltd.
  185. Special free licencing consideration will be given to similarly free
  186. software. Please don't flame me for this licence - I've put a lot of
  187. hours into this code, and if someone uses my software in their product
  188. I expect them to have the courtesy to contact me first.
  189.  
  190. Full support for this module is available from Fastnet Software Ltd on
  191. a pay per incident basis. Alternatively subscribe to the Perl-XML
  192. mailing list by mailing lyris@activestate.com with the text: 
  193.  
  194.     SUBSCRIBE Perl-XML
  195.  
  196. in the body of the message. There are lots of friendly people on the
  197. list, including myself, and we'll be glad to get you started.
  198.  
  199. Matt Sergeant, matt@sergeant.org
  200.  
  201. This man page was added as well as some serious modifications to the script
  202. by Fabien Ninoles <fabien@debian.org> for the Debian Project.
  203.  
  204. =cut
  205.  
  206.